SemaphoreSlim é baseado em SpinWait e Monitor, então o encadeamento que espera para adquirir o bloqueio está queimando os ciclos da CPU por algum tempo na esperança de adquirir o bloqueio antes de ceder para outro encadeamento. Se isso não acontecer, os threads permitem que os sistemas alternem o contexto e tentam novamente (queimando alguns ciclos da CPU) assim que o SO agendar esse thread novamente. Com longas esperas, esse padrão pode queimar uma quantidade substancial de ciclos da CPU. Portanto, o melhor cenário para essa implementação é quando na maioria das vezes não há tempo de espera e você pode adquirir o bloqueio quase instantaneamente.
O Semaphore depende da implementação no kernel do sistema operacional, portanto, toda vez que você adquire o bloqueio, gasta muitos ciclos de CPU, mas depois disso o thread simplesmente dorme o tempo necessário para obter o bloqueio.