I’ve looked at one such project where the number of unit tests made the system take too long to test everything. “Too long” meaning that you basically didn’t do that as part of your normal development routine.
However, what they had done was to categorize the unit tests into two parts. Critical tests, and “everything else”.
Critical tests took just a few seconds to run, and tested only the most critical parts of the system, where “critical” here meant “if something is wrong here, everything is going to be wrong”.
Tests that made the entire run take too long was relegated to the “everything else” section, and was only run on the build server.
Whenever someone committed code to the source control repository, the critical tests would again run first, and then a “full run” was scheduled a few minutes into the future. If nobody checked in code during that interval, the full tests was run. Granted, they didn’t take 30 minutes, more like 8-10.
This was done using TeamCity, so even if one build agent was busy with the full unit test suit, the other build agents could still pick up normal commits and run the critical unit tests as often as needed.