@sharkyh2o, @parky and I are all on the same wavelength here: a serial sequence of six TON timers, representing each of the six unique combinations of lights in the sequence from @sharkyh2o's diagram: Green1(25s); Yellow1(5s); Overlap1(3s); Green2(25s); Yellow2(5s); Overlap2(3s). The overlap timers run when both red light should be lit. The four non-red lights each need only the /TT bit of one timer.
OP does something similar, as @sharkyh2o notes, also using six TONs, but the concurrently-running RED and GREEN_2 TONs muddy the waters for anyone trying to understand the logic.
I still think this should be done with one timer, or none as demonstrated earlier, which cuts the number of rungs roughly in half.
But to make the case for clarity (and comments) I added working examples of a couple of six-TON approaches to the Github repo
here; cf. specifically the PDFs
traffic_light_6TON and
traffic_light_6TON_orig. Those are not the only possible paths using this approach, but I think they do maximize clarity and minimize complexity. Those programs also eliminate the duplicate destructive bits of OP's nighttime subroutine by integrating nighttime operation in the main program via two small, easily understood, OR branches.