Back in the days, when I used Ogre 1.x I remember that the shared pointers were used in Ogre very intensively which lighten the burden of thinking about the ownership of the pointers. It was very comfortable to work with such interface and to ensure the lifetime of an Ogre's object, it was just necessary to store the share pointer to your own interface (if needed).
Now in ogre-next I have to say, it is horrible (sorry for criticism) - the worst thing which API can do, is forcing developer to constantly look in its implementation about the deletion of the objects.
If a VAO is destroyed, the VaoManager doesn't delete its vertex/index buffers. It is up to the developer to track the ownership of the pointers - an example of bad implementation is in Ogre::SubMesh::destroyVaos - tracking where the pointers are placed and delete the pointers only once (if they are shared between multiple VAOs within the same SubMesh). If I create multiple VAOs for different LODs using same vertex buffer shared between multiple sub-meshes, I have a problem - but interface doesn't restrict anything here.
Here I think using shared pointers make perfect sense and solves a lot of problems and allows to remove such implementation like in Ogre::SubMesh. Why the shared pointers are not used there? I see in ogre-next at several places some kind of motivation to avoid usage of shared pointers, but I don't see any good reason for that. Deletion of the objects doesn't happen too often, so the framerate shouldn't be influenced here.
The modern c++ tend to avoid usage of raw pointers (replaced with e.g. std::unique_ptr, std::shared_ptr, etc.) so I am really surprised from the beginning of studying ogre-next that there are so many usages of raw-pointers. They are problematic as the ownership is not clear.
At my work, our software uses another rendering API, which deals only with raw pointers and tried to track the ownership internally - the problem is, that if we keep such pointer outside the API (at our side), there we had to put really huge effort to ensure the life time of the objects which engine can delete by itself as it doesn't know about the references outside it - shared pointers can solve all such problems.
For me a good c++ modern API limits the wrong usages by using input types properly (e.g. using references instead of pointers as input where the input cannot be nullptr), clearly implicitly states the ownership of the objects (input and also output) - using unique and shared pointers and using move semantic to move ownership between the calls. Ogre-next seems to avoid those principles a lot at many places.