If throw was impacting performance, their implementation on the back end was likely utter shite, given that it should have a simple fixed handler for all such events, and should be used when on error you plan to STOP EXECUTION!
That's almost always a sign of it being misused, is when people use it for error states that aren't terminal. That's what exceptions are for in most languages, thus why unhandled exceptions are supposed to go bits-up face-down.
But as I've said many the time far too many programmers -- and programming languages -- let the software blindly plod onwards in an error state, rather than halting altogether so that everyone knows it's broken and bad things are happening.