I think it's needed to unsubscribe from events in OnDestroy to prevent memory leaks, such as:
private void OnDestroy()
{
    if (StatsManager.Instance != null)
    {
        StatsManager.Instance.OnStatsChanged -= OnStatsChanged;
    }
} 
This works, except for when exiting play mode, sometimes it will log:
Some objects were not cleaned up when closing the scene. (Did you spawn new GameObjects from OnDestroy?)
 
I believe it's because:
- Unity destroys 
StatsManager first. 
- Unity next destroys the other GameObject that unsubcribes from 
StatsManager event. 
- When checking 
StatsManager.Instance != null, it causes StatsManager to respawn since StatsManager.Instance is null. (Internal Singleton behavior) 
What's the best way to avoid this issue?