Most VM's on AWS and Azure are hyper-threaded machines, i.e., 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 Azure machine H16m, you should see 100% CPU usage.
Gurobi chooses on its own whether to use hyper-threaded cores or not. The decision depends on the model size, the status in the algorithm, and other factors.
For example, if you allow more then one job on a cloud machine (for example by using JobLimit=2, which limits the number of simultaneous jobs running to two), it is possible that the CPU utilization will increase beyond 50%. This then means that one physical core has to deal with more than one thread at the same time.