$MaxScanTime bumps up a bunch...but it is somewhat Heisenberg-y and not a real indication of performance. Ethernet comms are kinda ugly due to the stack overhead, and monitoring causes lots of comms. Serial/USB comms cause far less impact...no stack.
$ScanTime (DST1) is actually an exponential moving average, and is a much better indication of overall performance. If you need the actual scan time of the last scan, it is in $ElapsedTicks (DST4).
I have never really seen a case when using programs hurts things bad enough to matter, and certainly never enough to give up the benefits of modularity. When you then add YIELD and/or Stages to the mix, it becomes even less of an issue.