I find Awake and Start very useful for initializing MonoBehaviours. Awake is great for initialization that only references itself because other MBs may not yet be ready. Start is great for initialization involving referencing other MBs because they are ready by the time Start is called. OnEnable can be used in there but it may be called many times. What about for de-initialization? There are many times, especially when using events, that I want to run de-initialization logic that references other MBs but I don’t believe you’re guaranteed they still exist during OnDestroy. We could try to use OnDisable for that, but it may be called many times during an MB’s life so that would mean moving that initialization logic into OnEnable to match and ensuring it is valid for the MB to be initialized and de-initialized potentially many times.
I think this topic depents mostly on how do you use these methods to your advantadge. As you said, OnDisable is good for unbinding events from another MonoBehaviour. However, I would never unbind events OnDestroy, since that could cause unplayability during play time, and OnDisable is called when you destroy an object, so OnDisable will always be better and safer.
If you’re not sure if a MonoBehaviour containing events still exists, you can always add an if statement to check if the event still exists or not, and then binding or unbinding it on the OnEnable and OnDisable calls.