I'd say in a lot of, or most circumstances it's best to just bite the bullet and refactor the mess into something more maintainable.
But there are exceptions to every rule, and let's face it, sometimes it's just too expensive.
Well what you can often do in these circumstances is just mock out the whole damn time package. That's what I did when faced with a similar situation and I was pleasantly surprised with the results.
I wrote https://github.com/echlebek/timeproxy to be a drop-in import for stdlib time. (Modulo any drift in stdlib since it was written)
I wrote https://github.com/echlebek/crock as a fake time implementation that I can exercise complete control over. It lets me control tickers, timers, time.Now, and all that however I like.
Since timeproxy just dispatches all calls to stdlib by default, I feel confident using it in production.
crock has some bugs, but they usually only show up in pathological cases, and you can easily prove that its code path will only get executed in tests, by ensuring that it only gets imported in _test.go files.
So far to my knowledge I'm the only user of these libraries, although I have employed them in a large open source application. Really, the libraries are less important than concept, which I learned from a Go author's slide deck on mocking out the os library years ago.