I have made that exact mistake of following an appnote and driving MOSFETs sloowly with 1k gate resistance. The result is, they spend too much time on linear region, SOA is exceeded with usual load capacitance (I had less than 2000µF) even if you don't have short circuit condition, and the FETs blow up as short circuits. Bad for BMS, since it then allows overdischarging or even worse, overcharging of the pack.
Really, I would not recommend designing a BMS power path semiconductor switch without desaturation detection (and/or current sensing, basically the same thing). What I did to fix the mentioned failure, was to sense voltage over the MOSFETs and drive the gate low with comparator within microseconds, with just some tens of ohms of gate resistance, and clamp ringing on the DC bus with TVS + snubber. I tested this with different short circuit currents, varying the amount of shorting resistance, measuring peak current and reaction time. Finally it matched spreadsheet modeling quite well, triggering around 50A (modeling said unit variation between 40A .. 70A. Yeah, Rds_on, copper resistance, fuse resistance are not closely matched parameters.)
What I also did was to use N-channel MOSFETs and MCU generate the gate drive using charge pump, safeguarding around stuck code, since square-ish wave was required to keep the switch on. Seeing that MCU existed anyway and chargepump components are near zero cost jellybeans, the total cost was also lower thanks to better performance of N-channel MOSFETs at high currents.
Thinking that you can avoid short circuits by not doing mistakes, and avoid short circuit current into capacitors by adding separate precharge path is quite risky, IMHO. Even the cheapest Chinese cell protector modules sense Vds to implement short circuit protection!
A small nitpick, contactor is specific type of electromechanical device, not a generic name that can be applied to semiconductor switches. The generic term you are looking for is just "switch".