I could indeed have extra yields be added automatically, but that may be more tricky than you make it sound (or maybe I'm misinterpreting). For example, putting a yield in a tight loop might kill performance, and not putting it there might kill cooperation. Trying to solve this would bring us pretty close to the above reduction counter, wouldn't you agree?
Have you tried yielding only on function entry and all backward branches?