Trains are conventionally timed using "the graph", which essentially means a sort of distance-time graph plotting the geography of a line or route, against the hours and minutes. See below for an example:
On a completely blank graph with no trains, you wouldn't need pathing at all. The train you're timing would simply take as long as it takes to get from A to B. That in turn depends on the type and maximum speed of the train, as well as whether it calls at any intermediate locations.
But as soon as you have multiple trains competing to run along the same bits of track (or conflicting at junctions/stations), it will quickly become the case that one or more of the trains can't run as it optimally should - because there will be another train on the line in the way, or a conflicting move at a junction.
In other words, the line representing the train on the distance-time graph would cross another line (train), representing a conflict. That is not allowed unless it is a non-conflicting move (e.g. a fast train passing a freight train that's in a loop).
In all other cases, you need to allow the headway or junction margin between all trains - the default value is 3 minutes, but it varies widely depending on the signalling and track layout.
Pathing is the solution to this conflict. It is the purest form of "padding" in a sense, but it simply means that you add extra time to a train's schedule to keep it behind another train on the line ahead, or conflicting move at a junction/station.
Because with pathing you are artificially extending a train's schedule, if the train is running late, then it should (theoretically) be able to catch that time up. Similarly if, for example, a "runs as required" freight train, that it was pathed to run behind, is not running that day.