Use the timerOp argument which passes you already the correct operatr object.
timerOp.destroy()
You can use a delayed function call. The callback is still called as part of the timer, so removing the time while the function still is running certainly can result in a crash.
run( lambda: timerOp.destroy(), delayFrames = 1)
Maybe try to recycle your timerCHOPs instead of creating and them on the go.
That being said, as @alphamoonbase mentioned, you might want to rework things a bit so that you don’t have to destroy timers this way and reuse one, or multiple.
They are many examples of use cases for the Timer CHOP in the Op Snippets.