CrossRoads:
Writing blink without delay style code also doesn't lend itself well to jumping out to functions.
Why not? It is generally necessary to do something, record when that happened, an possibly change the interval to the next event. That can all be done in a function.