I also use exceptions for control-flow and I feel no shame about it. It's often the best (most concise, most performant, most understandable) solution to a problem, in my eyes.
I disagree. An exception can be faster than manually unwinding a set of nested scopes.
But most importantly, static type systems lose the ability to infer what's coming so these may turn out to be really pesky problems.
Personally I have no problem with your approach on the semantic level, but most compiler/interpreter developers consider all exceptional paths as cold as it gets: performance can be "interesting" if you take a lot of them.