If polling in the loop has to much lag, then something in your code is eating too many cycles at one time (pretty common with the way Arduino is taught). You need to avoid using the delay() in your code with anything other than a single digit value.
The problem with button triggering actions on the interrupt is that many things can not be called from within an interrupt; so you will have to queue the input and then in the loop look for the input being present. This still is a good way as it makes the input detection more accurate; but doesn't solve any lag caused by slow loop code.
In my Task Library
you will find some examples that show doing similar things. It might help to glance at that.