I think you're touching on a key issue, but you may not be stating it correctly. Or at least, not fully.
The fundamental issue I have had with the Coroutines TS is that they aren't coroutines. They are continuations. They are nothing more than a way to halt the progress of a function, "schedule" its resumption, and return a value to the caller which allows the caller to track the progress of the continuation.
So if you want to have a call stack halt its progress and schedule the entire stack's continued execution (which is precisely the case when you want to `co_await`/`co_yield` through an algorithm), the only way to do that is to have every function between the first caller and the first one that does the halting to be involved in that process. Every single one of them must `co_await` on some future-like object, and every function involved in that chain has to be a coroutine function.
Which effectively means that passing coroutine functors is... dubious. It's not always wrong, but it should be looked at with suspicion.
This is why I much prefer P0099/P0534 coroutines. You can halt them anywhere within the coroutine stack and relay values back to the destination. The principle downside (besides syntax) of this is the huge cost incurred by having to allocate a call stack for the coroutine. That makes using them for light-weight generators problematic.
The principle advantage of the Coroutines TS is that their continuation syntax makes complex asynchonrous code look almost exactly like the synchronous equivalent. To the point where you barely notice that it's async code.
Here's some slow synchronous networking code:
auto data = network::get_data(...);
process_data(data);
network::send_data(feedback(data), ...);
And here's the async version of it:
auto data = co_await network::async_get_data(...);
process_data(data);
co_await network::async_send_data(feedback(data), ...);
I love the library coroutine proposals, but they can never be that easy to read.
Unfortunately, so long as the primary proponents of the Coroutines TS remain singularly uninterested in re-evaluating their design and doing the some experimental work to retain the beauty of the syntax while allowing multiple stack frames, these flaws will remain. While lots of papers were written about alternative language mechanisms for real coroutines, none of those authors have the resources to commit to actually implement any of them in a compiler.
So however flawed the Coroutine TS certainly is, it is at least backed by existing practice, rather than being something entirely speculative. If we could get people with the time, resources, and domain knowledge to get a better language feature, I suspect the committee might consider it, either as an alternative or as a replacement.
Indeed, if I recall correctly, that was part of the point of shoving P0057 in a TS rather than the standard itself.