Alright, I've played a good deal now with limited issues, and I'm coming to believe that after you look past the launch issues, server issues, and bugs that are still in the game (and there are a lot), the underlying glassbox simulation is fundamentally flawed.
Disclaimer: Most of this is based on my game experience, dev talks/diagrams about glassbox, and taking a close look at the gameplay and complaints of other people. It may be wrong, but at this point I am reasonably sure that this is correct.
At its most basic level, the game basically simulates a bunch of commodities (power, water, people) moving from a supply to a sink. On the move, these commodities are called "agents". However, once the agent reaches the destination, the agent simply drops its payload into the sink and then is discarded from the simulation. Commodities themselves are just a simple object with a type and quantity, and possibly a few other minor attributes (e.g. 1kL of water, 10% polluted). Once they hit the sink, they just add their payload to the mass of the sink and any unique characteristics of that individual payload is lost.
What this means is that individuals don't really exist in the simulation except during transit. Once they hit the sink, they just become one slightly bigger blob of humanity just like a drop of water would when it hits a pool.
Many people have complained about the pathfinding in the game. The issue is not the pathfinding, but rather the actual determination of the destination. It appears that every time an agent is created, it finds the nearest sink with capacity for the type of commodity that the agent holds. The agent then heads toward the sink, and drops off its payload at the first sink that it encounters on its journey (which isn't necessarily its destination if a sink opens up on its way to the original sink).
The problem with the above is that, as density increases, the closest sink is the same for a huge number of agents. All of those agents try and get to the same sink, even though the sink itself can't handle more than a small fraction of the agents. Ideally the agents that reach the sink after it is full can find another nearby sink, but eventually all the "nearby" sinks will fill up and now those agents may have to trek to the other side of your city just to find an available sink.
A better (but still far from ideal) situation would be for an agent to call "dibs" on a sink when it is dispatched toward it, such that only an amount to fill the sink is sent to a particular destination and the next agents know that the sink is effectively filled, even if it isn't at the time they are created. My guess is that this isn't done because of scaling issues, as you now have dependencies between the agents which prevents some parallel/bulk processing (note that you can still gain some parallel processing power even if you are single-threaded because you can bulk shortest path requests together, for example).
The best solution and most accurate would be for individuals to be tracked and have histories -- what job they have, what house they live in. You would have a better distribution of traffic during rush hour because people from the same source would be heading to different locations, rather than all of them heading to the same location. You also wouldn't have the issue I've described above where you are overallocating agents to a particular sink.