не понимаю, при чём тут корутины?
потоки удобны как уровень абстракции между клиентским кодом и физической реализацией i/o. Захотел - подсунул поток в файл, захотел - в сеть или в буфер в памяти. Это полезная абстракция. Возможность дописать операторы ввода-вывода для своих типов - тоже большой плюс.
эта абстракция уровня "получатель бинарных данных", у него один метод с span<byte> возвращающий void без контроля ошибок