Reuben,
I agree THROW makes more sense and the prospective syntax you provided meets the spirit of the request. I see your point on the CASE vs multiple CATCH clauses - the multiple CATCHes seem syntactically cleaner to me but since CASE achieves the objectives, I'd be good with that.
Regarding exception propagation, I'd personally want to allow a THROW anywhere, including outside a TRY. I would think the control flow behavior would be whatever would otherwise happen with a system exception based on the WHENEVER in effect - if RAISE, exit the function and propagate to the parent, if CONTINUE, continue, if STOP, stop, and so on. The behavior of your example of CALL foo(bar()) might vary based on that, but for RAISE or STOP, it would NOT call foo in that case because execution within bar() would stop without a return value. For continue, the THROW would have no effect other than to set the status, so it WOULD call foo, and for CALL it would call the designated function, then continue and end up calling foo as well. At least, that's how I would view it.
The intent of FINALLY is to imitate the Java behavior which is a bit different from what you described. FINALLY always executes at the end of the TRY block, not just when there is an exception - that code is guaranteed to execute before leaving the TRY block, regardless of what happens - exception, no exception, RETURN in the TRY block, whatever - and it's value is in that guarantee. Truly imitating that behavior would require multiple additional statements, not just a CATCH case with an OTHERWISE.
Thanks for considering this!
Eric