You can re-enable interrupts within an ISR once the context is saved provided that you keep a count of the interrupt nesting depth, and only restore a context once the nesting depth is zero again. You will have to disable interrupts again while you restore the context.
Consider other options first - like using FIFOs, organizing your ISR to trigger a high priority task to handle the data with interrupts enabled, etc.
If you are not using the isr to wake blocked tasks you can also speed things up by using a simple circular buffer instead of queues/semaphores. You still need to keep a count of the interrupt nesting depth but don’t need to save and restore the context which will speed things up a lot. You can renable interrupt immediately after incrementing the nesting depth, then disable again immediately before decrementing the nesting depth.
The AVR port does not save the context until a switch is actually required. You can enable interrupts prior to this point provided the interrupt source is cleared first. Disable again for the switch.