First of all, while DOTS is a good options for such kind of game, it’s not the only option.
Factorio for example, while it was made with C++, it was made without ECS, and in fact it was made with OOP in mind.
You can throw multiple threads at solving a problem, but the key is efficient algorithms.
If you want to be sure that performance wouldn’t be a bottleneck, then of course try DOTS.
I’m not expert in DOTS, but I have years of experience in ECS, and my advice, if majority of your gameplay code is built upon ECS, you should probably use it for the rest of your features.
Exceptions are probably UI, Audio, VFXes or non-gameplay related things (but it all depends).
With player you should just care less about performance. Like there is no reason to write jobs or utilize cache friendly layout for single thing. But if you already work in context of systems and components, I see no reason to use another workflow for specific features, because you will be required to connect these two worlds, and will probably lose some ECS benefits.
Regarding rendering, I’m not sure how many things will be visible on your screen at once and what style will your game have. Will it be something like Factorio with sprite animation? Or will it be Spine2D?
The general advice is, utilize batching as much as possible, I’m not sure about instancing for 2D, but you can research that too, maybe try reusing same sprite/animation state for the same objects (e.g. conveyor belts), and just don’t render things player won’t see.
Also, try benchmarking. Just make simple scene with dozens of objects which constantly update their animation and check what performance is and how can you optimize it.
Maybe you will be required to write your own thing if nothings suits you. If you know limitations of your game, like it will be 2d or 2d tile-based, you can google/write specific culling/streaming/chunk/partitioning algorithms which will suit your needs. Unity GameObjects are probably not suitable for your genre out of the box.