El tema es que $slot siempre existe en un componente. Aunque esté vacío $slot es una instancia de una clase. En concreto de la clase Illuminate\Support\HtmlString. Por ello las alternativas que intentas no te funcionan.
Para saber si la instancia de Illuminate\Support\HtmlString tiene algún contenido debes usar el método isNotEmpty() sobre $slot.
El código sería el siguiente:
@if($slot->isNotEmpty())
<div class="contenido">{{ $slot }}</div>
@endif
Es verdad que no resulta demasiado intuitivo si esperas que $slot sea un simple string. Pero es fácil de solucionar en tus componentes blade.
Puedes comprobar que es un objeto Illuminate\Support\HtmlString haciendo esto en el código del componente:
{{ var_dump($slot) }}