Most VM's on AWS and Azure are hyper-threaded machines, and each physical CPU core appears as two logical CPU cores. When you see "50% CPU utilization", it means that all physical CPU cores are used. On machines where hyper-threading is disabled, such as an Azure H16m machine, you should see 100% CPU usage.
Gurobi chooses whether to use hyper-threaded cores or not. This decision depends on the model size, the status in the algorithm, and other factors.
If you allow more than one job on a cloud machine by using JobLimit=2, which limits the number of simultaneous jobs running to two, the CPU utilization might increase beyond 50%. This means that one physical core has to deal with more than one thread at the same time.