It appears that r7731 (and then r7742) indeed fixed this desync by accident.
There was a train with route_index == route.get_count(), which called the block_reserver in can_enter_tile due to next_block+1<route_index. However, block_reserver immediately returned false, which was ignored, then cnv->set_next_stop_index was called, but next_signal and next_crossing were not assigned in block_reserver -> undefined value propagating.
valgrind would have found this, but I could not get to run it on my machine, the savegame was just too heavy.