If the task is pretty short and time sensitive, your best option is to
put it in the interrupt handler.
If the task is big and not too urgent (like: it could well wait for a
millisecond or so), your ...
I wrote a minimal sketch that calls RTC_DS1307::now(), disassembled
it, and here is what I saw:
The caller allocates 6 bytes on the stack for holding the return
It writes the address of this ...
Since you tagged it Teensy: You could also reduce the priority of the interrupt, so that it can be interrupted by higher priority interrupts. Thus you can implement interrupts with longer durations ...