All of the above are pointing at the same issue: get the UART code out of the ISR. Put the value in a 'most recent reading' variable or, if necessary, put it in a queue (I would hesitate to add this much code to the ISR but I have done it before). Using a queue to synchronize the data is kind of an advanced topic because the queue reader is probably running with interrupts enabled and the queue writer is an interrupt routine that could be writing in the middle of the reader code. It takes a bit of care to get this right.
Given only a fragment of the code, I can't see if there are other interrupts of higher priority that may interrupt this ISR. That can be an issue.
I would look at the library code and see how it is written. In general, I don't use any provided code, especially for interrupt handlers. Every function I call has overhead getting in and out. I would want to know if reading/writing the timer was atomic (happens in one cycle) and, if so, I wouldn't bother to start and stop it. I would just grab the reading and set the counter to 0. No start, no stop, just grab and run. I want in and out of that ISR as fast as possible.