Ну, самый большой недостаток в вашем вопросе - это то, что веб-сервер также может генерировать контент динамически. Это характерно для большинства платформ вне PHP и Perl. Вы часто устанавливаете этот веб-сайт как apache или nginx, используемый в качестве прокси-сервера, но он никоим образом не "вызывает внешнюю программу", а перенаправляет запрос http на проксируемый сервер. В основном это делается для того, чтобы вы могли иметь несколько сайтов на одном сервере, а также чтобы apache / nginx защищал вас от неправильных запросов.
Но, разумеется, мы можем, ради вопроса, сказать, что «проксирование» - это способ вызова внешней программы. : -)
Другим способом «вызова внешней программы» является Pythons WSGI, где вы вызываете постоянно работающий сервер. Итак, снова вы не запускаете внешнюю программу, это больше похоже на вызов модуля в ASP (хотя это отдельная программа, а не модуль, но вы не запускаете ее при каждом запросе, вы используете API).
Переход от вызова внешних программ, как в CGI, к вызову модулей, таких как в ASP.NET, к процессу с WGI или прокси к другому веб-серверу, произошел потому, что с CGI вы должны запускать новую prpogram для каждого запроса. Интерпретатор PERL / PHP должен быть загружен в память, а также во все модули, которые они используют. Это быстро становится очень тяжелым и интенсивным процессом / памятью.
Поэтому, чтобы иметь возможность использовать большие системы, которые постоянно работают, были разработаны другие методы. Большинство из них зависят от платформы / языка, и единственное, что не зависит от платформы, - это сделать полноценный веб-сервер и затем использовать apache / nginx в качестве прокси-сервера (в этом случае apache / nginx больше не нужен) ).
Надеюсь, это немного прояснилось.