I'm going to assume that the way you came across initially is a language barrier problem, and I will try to answer more directly.
In general, Tonic is able to run independently on several threads without there being any extra performance cost compared to single-threaded.
One of the things that's hurting Rust's performance in that particular benchmark is that the accept loop is running directly inside a call to block_on. This can be a performance problem because a tokio::spawn task will never run on the same thread as a block_on task, which means that all connections must be transferred to another Tokio thread before they can be processed.
Moving the accept loop into a spawned task can help because then it is possible for tasks to be executed without having to move them to another thread.