If gazebo ends quickly and cleanly with SIGINT and SIGTERM, then you shouldn't need kill -9 to take it down. With this modification in the benchmark (mud.world), it brings shutdown time from 55 seconds → 0.5 seconds.
The test was failing in CI because a Publisher was shutting down before all of it's OnPublishComplete callbacks had been fired. We can catch the exception here, but I don’t really like this answer. I’m going to see if I can flush out all of the pending callbacks as the Publisher is being shut down.