There is nothing "horrible" about MySQL. Your application is broken.
If using Tomcat's removeAbandoned "feature" mostly fixes your issue it is further indication to me that the connection leak lies within your code. What is "horrible" is the very concept of the removeAbandoned function, and that is why HikariCP does not include such a feature.
What that feature is doing equates to saying, "Look, your application has a leak. It allocates a connection via getConnection(), and then it never closes it. But it's OK, we [tomcat] will come around and cleanup the mess [abandoned connections] that you made, and then your application can continue on its merry way."
A connection pool should never hide or cover-up bugs in the user's application. Your application has a leak, that is crystal clear from the information you provided above. HikariCP is not going to "fix" that for you, and you shouldn't want it to. But what HikariCP can do is to help pinpoint the source of the leak. That is the purpose of the leakDetectionThreshold property. If you set leakDetectionThreshold to 60 seconds (60000ms), for example, then any code that calls getConnection() but does not return it to the pool by calling close() within one minute will generate a log message.
That log message will include a stacktrace that points to exactly the line of code in your application where the connection was allocated. Following your code from there you should be able to find exactly where the connection should be closed but is not being closed. Generally speaking, it is very risky not to surround connection usage with try...finally blocks, wherein the connection is released in the finally.
Stop blaming Tomcat, HikariCP, or MySQL -- they're used by some of the largest and most heavily trafficked websites on the internet without the problems your application is experiencing. Fix your application.