It could simply define the methods as abstract in MonoBehaviour base class and force the subclasses to implement it.
One of the advantages of the system Unity uses is that you don't have to implement every MonoBehaviour message, of which there are over 60.
Usually we just need one or a small handful of these methods. Since some are specific to 2D/3D physics, some unique to cameras or particle systems, it's highly unlikely that any one script would ever need all of them.
By leaving the messages we don't need as unimplemented, we can clearly signal to the runtime "don't even bother calling OnCollisionStay2D on this object — I don't need it"
This can be a substantial efficiency win. Now the engine can filter down a short-list to call Update on only the ~20 objects in my scene that need custom update logic every frame, and not all ~200 objects that make up all the scenery or only respond to physics events.