The most rational answer here is like with any other non-trivial topic...: it depends.
I personally always use reset signals and have never even used signal initialization. My rationale is that, unless I'm mistaken, signal initialization is not synthesizable in general (it is with many FPGAs, but not quite all, and there's a life with HDLs beyond FPGAs.) Unless I design very very specific stuff tied to some specific FPGA, I usually write code that can be synthesized unmodified also for ASICs.
Then async vs sync, that really depends on 1/ the requirements (in some cases, sync resets are more appropriate as the behavior is 100% predictable at the clock pulse level) and/or 2/ difficulties to meet timings. If neither are a concern, I've found async resets to be fine on all FPGAs I've used and I've used them liberally. I'm certainly not in the fanatic camp of those that are against any form of async resets no matter what. Even on Xilinx FPGAs.
The "no-reset" approach, apart from the point above (of signal init. not being synthesizable in the general case - but you may not care if you're dead sure you're never ever gonna use your code on any other target than one that is fine with this, or if you don't care about initial state), has another, obvious problem: you have no way to reset outside of ROC (reset on config), which may be OK in some cases, or not in others.
Just my 2 cents.