Thank you Luis for jumping in.
The more I work with "Go" (golang) I find that my own thinking pattern - while coding - changes from building code that is crafted to do one thing right (working from top to bottom until the task is done) into creating code that is far more flexible and reusable for different applications. For this producers/generators and listeners/receivers need to be build. Once the work is done the application is as fast as it can be without bogging down the whole system in times where a lot of "data traffic" is happening.
Sure the same can be accomplished with threads or even without threads, but depending on the application at hand the system might experience some trouble, like the GUI is unresponsive because a thread is sucking most of the CPU time - inserting delays into the thread only mask an issue (in another forum-thread it was said inserting delays is the "better" solution...). When an application is developed and used for 5 or 10 years all these little delays may even slow down the application more then need be. Or if you create a thread-less application you can only use the code for this specific application; every time you try to reuse the code you end up rewriting most of it anyway.
As Luis' link (using C) showed coroutines can be created without being build into the language.
In the end build-in coroutines are not a "must have" but a "nice to have" thing.
Also every one is entitled to a different opinion
Sorry that the bake bread/eat bread example was too simple for you...