I came to use an epoch based reclamation approach where a token is passed between all threads in the system. Since this chain involves only relaxed read/writes, it has practically zero overhead. The only downside is the relatively high latency between retiring and recycling the memory. That and all participating threads must occasionally process their epoch.
I hadn't seen this exact approach used elsewhere, all the other epoch approaches were more complex and required atomic operations at certain points.