Passing Block
In vanilla, double-track single-direction rail makes sense, because the distances are all pretty short, and train volume per track-mile somewhat high. The Marathon + RSO setup mimics Railroad Tycoon, which in turn mimicked real life - distances between stations are very long, rail a substantial outlay, and traffic density over most long stretches low, only getting high near the hub. Single track works nearly as well as double track for most of it.Railroad Tycoon had a somewhat simple rail model. Any number of trains could occupy a signal tower, but the blocks between signal towers could only take 1 train per track. However, direction didn't matter, so a double-track block could take 2 trains going in the same direction just as easily as trains headed in opposite directions. This meant that fast trains could easily pass slow trains, which was common since RRT had short, fast passenger trains and long, slow freight trains. The typical Factorio two-lane track can't do that.
This is generally a non-problem with most Factorio train setups, since I imagine most of us run trains of very similar length. I'm currently running 1 locomotive + 2 wagons for all my trains except my passenger train I use to maintain stations, which is a double-header with a single wagon. You may run much longer trains, but odds are they're nearly the same length.
Still, that had me thinking "how would I solve that?" That is, how could a create a two-track system where trains could run in either direction on either track, switching tracks at signal blocks if desired, or waiting if the rail block was full?
I thought I had a relatively simple solution until I discovered how finicky train pathing is. Trains will always choose the shortest path, even if that path is currently blocked by another train waiting at a signal. An early "waiting zone" I created for my master train station clogged up because trains ignored sidings and waited for the most direct route to open.
What does work is paths that are exactly the same length. Trains will choose any track and pass stopped trains if the paths are equal length.
Waiting Zone
Thus, a theoretical signal block might be possible, one that routes trains to one of 2 two-way tracks, and which allows trains to wait if both are full, or pass trains in either direction without delay. The obvious thing was to split into 4 one-way tracks, two in each direction, since regular rail signals really need one-way track. What defeated me was keeping all paths the same length. If the first block's tracks are A1 and B1, the signal-tower tracks are East 1, East 2, West 1, and West 2, and the next block's tracks are A2 and B2, invariably there would paths that were shorter than others. A1 -> East 1 -> A2 and A1 -> East 2 -> A2 might be the same length, and A1 -> East 1 -> B1 and A1 -> East 2 -> B2 were the same length, but A1 -> A2 paths were shorter than the A1 -> B2 paths, so trains would never switch from A to B if B2 was full.
Here's an odd-looking and space-consuming attempt. Some curves are in there in an attempt to adjust path length. There are signaled waiting segments at the start and end in both directions.
Signal Block