getSimTime() is the "physical" time. It's affected by things like timescale. getRealTime() is the "real" time. It's the computer time, meaning it's completely unaffected by timescale. As a result, getSimTime() is appropriate for things like physical loops, where you want to nullify the in-game gravity of a vehicle or find the new position of a moving StaticShape. getRealTime(), on the other hand, is appropriate for things like clocks which are supposed to remain synced to real time regardless of the timescale.
As of yet, in my mind at least, no one has ever made a sufficiently strong argument against using getSimTime() or getRealTime(). $Sim::Time has been preconverted into a decimal format, meaning that it has lost all precision beyond the first six decimal digits. With getSimTime() and getRealTime(), however, it's possible to retain the full precision through various means.
%threeSecondsFromNow = (getSimTime() + 3000) | 0;
%seventeenSecondsAgo = (getSimTime() - 17000) | 0;
%timeSinceLastCheck = (getSimTime() - (%last | 0)) | 0;
Regardless of what method you choose to use, it's worth noting that these values all, at their heart, rely on a signed 32-bit integer. As a result, these values will eventually become negative, after exactly 24 days, 20 hours, 31 minutes, 23 seconds, and 647 milliseconds. This can cause problems, so if you expect your script to be running on a server that will stay up longer than this, it may be prudent to make the script resistant against these types of problems.