The best feature is one that is provided and maintained by the platform. A feature that can be built using an API or through extensions/plugins is of course better than a feature that does not exist all. But: Building a feature means maintaining a feature.
An example: You can cobble together a functioning journaling/project notes solution, with daily, weekly and other periodic notes in Obsidian (using a handful of plugins and a carefully thought through file organization scheme). That works. You just have to remember how everything works the next time you touch that part of your setup. And hope that nothing breaks, between those loosely coupled building blocks and the next update. Or you could just use Agenda. Is Agenda perfect? No. But it is much more well suited out of the box for this kind of note taking.
There is also a risk of drift: If you're trying to organize your notes, you probably don't do so just for the sake of it, but because you try to become better at doing other things. The notes and also the notes setup are just helping to accomplish a task at hand. If your setup is complicated and some parts are even written by yourself, you might end up accomplishing everything else but the task you set out to check off in the first place.
Therefore, when I try to improve my current system, I always look for ways to use a less customized system. The more stock features I use the better. The burden of maintaining those features lies with the app developer.
Of course, there will be lots of cases where a feature just doesn't exist. In that case I try to live without this feature first. Maybe I don't need it as much as I first thought. If I can't live without it, I look for a plugin solution, again, to lessen the maintenance load on myself. I have to be aware, that I may not need to maintain the plugin providing the feature, but I am now responsible to make it all work, i.e. the burden of maintenance of the integration of plugin and setup lies with me.
Finally, I might write a plugin, script or customize an existing piece of code to make it do what I need it to do, but this is really a last resort. Very often this is not worth the time.