in general, the order of events from a single aggregate is the only fully guaranteed order. And of course events that were caused by another event, should generally be ordered as well. The order between all other events is not completely guaranteed.
In a replay from multiple source, I would recommend an approach where you read a message from each source, pick the one with the lowest timestamp (and then some other values as tie breakers) and process that one. Time on different machines isn’t guaranteed to be completely equal, but that’s generally not a problem, because the events have no absolute order either. Read the next from that source and compare again.
That said, my experience in general is that multiple components use the same “Event Store” to read messages from. In that case, your replaying component could just read from that store.