you can always use both together listening on different ports of course.
Your question has little to do with rust more to do with networking or communication design in general I believe.
I also developed a similar project using both protocols.
In my project, I wrote a socks5 multiplexer. Basically, the user connects to my server using socks5 protocol on TCP using any socs5 compatible client then I distribute this over UDP to my workers and they connect to remote over TCP again because that's how HTTP works.
In my case, the reason I chose UDP for communication among primary and secondaries is that UDP is a frame-based protocol and that enabled me to implement my protocol much easier since I did not need to follow where a message starts and ends simply when I sent a frame of length n from one node to another I would read n bytes on the other hand. That's not the case with TCP. In TCP the overall content integrity is guaranteed however there are no guarantees on particular frame size. For instance, you can write 50 bytes on one end and receive 20 bytes and 30 bytes on the other node.
So based on your needs you should choose the correct protocol also understand the ups and downs of each protocol.
To summarize
TCP:
Good for overall data integrity but really bad if you have a frame-based protocol. You'd need your own framing logic.
UDP:
Amazing if you are developing a frame-based protocol however some frames might just disappear sometimes no guarantees on the overall integrity.