I've found Geof's method (post#7) to be very workable. I came up with pretty much exactly the same solution when I was looking for a way to make OneCNC post a program with work offsets and subroutines, and no further hand editing required to make a successful "sub call" program.
Of course, running a Haas maybe makes this a little less painful, as the Haas can be set to ignore the re-reading of the tool change commands if the current tool is still modal.
Putting the tool change lines in the sub also makes it fairly quick and easy to search for the beginning of each sub by looking for its tool number, instead of trying to recall a sequence number.
First you get good, then you get fast. Then grouchiness sets in.
(Note: The opinions expressed in this post are my own and are not necessarily those of CNCzone and its management)