Так, чутка разобрался с этим graceful shutdown в aiohttp. В aiohttp-сервере есть два сигнала
on_shutdown
on_cleanup
Сначала вызывается первый, а второй уже после него.
Моя ошибка была в том, что я во всех приложениях вешал на первый сигнал обработчики, которые всё закрывали и убивали. Например закрывали клиентскую HTTP-сессию, которая использовалась для отправки http-запросов из приложения. Или гасил кастомные executor-ы, которые выполняли блокирующий код. Всё это на самом деле надо делать в обработчиках второго сигнала. А первый как раз нужен, что бы подготовиться к остановке сервера.