The fully functional M2 version of traffic I created has several important drawbacks: it requires trucks to be created and destroyed instead of looping their paths, it makes traveling up and down hill visually buggy and quite slow due to excessive collision with the ground, and the player can push the trucks around just by walking into them. Marcus' system requires looping, which is fortunately easily accomplished in our level and prevent the need to instantiate trucks out of thin air. The physics-based system makes moving on hills simple with the added benefit of creating a large chance for humourous accidents which show off Unity3D's inherent physics system and add to the realism of our cardboard world. The AI also aggressively tries to hit the player if they touch any trucks. The final benefit is by far the most important because trucks can not be used as a hazard if the player knows they can push them around. The old NavMesh-based approach I used does not create good traffic systems when collision with a player (who is also on the NavMesh) is required. Before getting help from Marcus, I also tried coding the traffic with character controller based on the scripts for the old NavMesh system. This approach led to far too many bugs that were difficult to fix because they were embedded in scripts that used concepts and functionalities that were custom built for the previous approach.
The take home message of this post: If you want hazards in your level that hit the player without being pushed around or passing through them on collision then stay away from NavMesh. Start with a simple character controller and build scripts around that strategy because switching strategies after the fact leads to buddy coded. Or for advanced Unity3D users with the time and smarts to build a physics-based traffic simulation, try using the built-in Wheel Colliders to make trucks move.