You make a lot of interesting points.
Mirror does handled movement syncing through the network transform component and you can implement similar functionality with other variables using syncvars.
For an AI component, I can imagine there are two ways to look at it. One way would be that it is mostly separate from the player controls, in which case it could be handled entirely server side, and that code would be almost all server implementation. The other way to do AI I think is just to have some minimum behaviour that interfaces with the player controls. In this case it would also run on the server side, but would have to interface more with the client code.
In terms of separate builds, I’m not sure at what scale it becomes more efficient to do this. Mirror is doing all the hard work in running all the server stuff, server side and client stuff, client side so we don’t have to think about it. Having that leftover code that isn’t running locally isn’t a big deal with todays hardware. I’m not sure how this is managed for other games. Certainly there could be backend server stuff that isn’t shipped to the end user, but in terms of gameplay I’m not sure how significant it is.
It makes sense to me that if you were building a game where there was significant separation between the parts it would make more sense to organize your code that way.