Running both TCP and UDP in parallel just leads to problems. Also, you might not need all the reliability features of TCP, so it might be overkill anyway.
Most games solve this problem by replicating those TCP reliability features they really need on the application level.
Do you have the concept of persistent connections? Add a connection-ID to every message.
Do you need delivery guarantee for certain messages? Have the receiver reply to these message with a confirmation. Resend any message when the confirmation doesn't arrive within a given timeframe.
Do you need to know the order in which messages were sent? Add sequence numbers to your UDP messages.
Do you need guarantee that sequences are processed in sequence? Add sequence numbers and allow the receiver to re-request a message with a given sequence number. Have it do that when a missing sequence number doesn't arrive within a given timeframe.
Implementing all of this on your own gives you far more control over what actually happens on the network level than just letting TCP handle it. But the bottom line is, real-time networking is complicated. Every game developer is well-advised to not reinvent the wheel and instead take a look at what reliable UDP libraries for game development are available for their programming language.