Область применения асинхронного программирования?
Асинхронный код позволяет выполнять код параллельно в одном потоке, итого профит в том что экономится память т.к. каждый поток требует память под себя. По сути все.
Итого это позволяет запускать 1Млн параллельных задач и более, экономя память.
Код не работает быстрее, а зачастую медленнее, т.к. ваша реализация переключения задач медленнее чем это делает ОС и процессор.
Выигрыш может быть за счет того что вы запустите задачи параллельно, когда в много поточном вы будете их блокировать друг другом. Но если под каждую задачу делать отдельный поток, то асинхронный не будет быстрее.
Асинхронный подход имеет смысл (только) когда в задаче есть долгие блокировки (веб-сокеты, сетевые закачки с зависаниями) - когда поток весит и ждет события, тогда вместо 10к потоков, можно все задачу уложить в один асинхронный поток.
Все бы нечего, но проблема в том что сложность асинхронного кода гораздо выше в разных аспектах, итого времени может тратится в разы больше (год на проект вместо 4 мес например).
Поэтому асинхронность применять лучше там где это оправдано (для веб-сокетов), а весь остальной проект делать "классически". А сейчас из-за моды некоторые пытаются целиком все асинхронным кодом делать, потом иногда по прошествии года/двух появляются статьи о том что асинхронность не стоит того, а их в комментариях обливают, что мол не умеете готовить.
Более разумным видится использование файберов/корутин, но эту тему не сильно развивают.
Грубо говоря - профит в ситуациях, в которых процесс простаивает во время выполнения операции (например, указанные в вопросе ситуации).
Соответственно, если работа происходит синхронно - в это время невозможна работа с другими запросами. Если юзаются "системные" потоки - уже лучше, но накладные расходы относительно высоки. Ну и существуют подходы, позволяющие лучше утилизировать 1 поток (нодовое event-driven, golang-е горутины и прочее).