Браузер, отправляя запрос на сервер, отправляет запрос HTTP (протокол прикладного уровня основанный на TCP). На сервере его может принять любое приложение, которое работает с протоколом HTTP. В большинстве случаев это действительно веб-сервер в стандартном его понимании (apache, nginx, lIS...), который в зависимости от своих настроек и входящего запроса может либо передать запрос по CGI/FCGI на PHP/Python/любой другой язык, либо отработать запрос самостоятельно (выдать картинку, заблокировать...). Но это применимо в основном только для скриптовых языков и stateless приложений. Statefull веб-приложения (обычно С/С++/Java/Delphi/C#) часто используют встроенный веб-сервер, который обеспечивает коммуникацию по протоколу HTTP без стороннего внешнего веб-сервера (apache, nginx)… Более того, даже при использовании apache, nginx не обязательно использовать CGI/FCGI, насколько я знаю, можно использовать обычное прокси.