I’m not suggesting x method over y method. Reopening tickets is another useful method. We have 3 or 4 different refund implementations explained in tutorials. Searching them might give other ideas as well.
Edit: I mean there is no single method that will just fit to the business needs. Reviewing different methods and implementing your own method will be the best solution. See how @QMcKay improved this method for his specific needs here Refund Item button. It works with settled tickets.