You don’t always get a stack trace, but it still has to unwind the stack, calling destructors as needed, and check the exception’s type against each catch block.
I’d simply add that most people greatly underestimate how expensive exceptions are, even in C++.