Although it sometimes feels a little clunky. However, sometimes that's all the language has available.

I like Icon's approach. It's a bit tricky to describe but the idea is that you can pass breaks up several layers all at once. And you can make the last one do a next, instead. It's really elegant. However, due to other qualities of the language, it doesn't get used all that much. This is because things like goal-directed evaluation and expression back-tracking and generators are usally used to implement the kind of logic and loops that people need to put in trap-door exits for. :-/