The total number of states is always going to be subsys1 * subsys2 * ..., but folding them all into one state variable only makes sense if we have a well-defined set of states *and* transitions between them. But even then it implies that we have enough coupling between our subsystems that we would even care what their aggregate state is, which is already a bad idea. If we keep the internal workings of our subsystems as internal details, then having private state variables is the way to go.
The real problem with system_state is that it has a few broadly-defined values, but no real explanation of what they mean, so they end up getting used in inappropriate ways (like the virt_addr_valid() thing I fixed yesterday).