It starts a server for (1) concurrency control (2) management of worker processes some languages use (3) caching the build graph (recall that Bazel works with very large code bases).
These reasons are independent of implementation in C++, Go, Rust, Java AOT, etc.
(And yes it doesn't have to use a persistent process to solve these problems. That is the solution it chooses.)
> not using a server design like basically every other build too
Buck, Pants, sbt, Gradle