tl; dr: the way vibe.d currently uses exceptions is completely unacceptable and is most notable existing performance killer.

To make usage of exceptions viable for control flow you need two changes:

1) Use preallocated (immutable if possible) exception instances. This can be done in user code and vibe.d own code

2) Don't generate stack trace in release mode (unless explicitly required). There is a pull request for DMD/Druntime to do it but it may take some time until it is merged.

Once these two conditions have been met it should be acceptable for typical web applications.