I've learned that babe chains, when all validators go offline, stalls and isn't recoverable. But my question is, from a database perspective we have the data in the chainstate folders right? So wouldn't it be possible to do something to "resurrect" a chain?
We do have the data of the current chain state but we are still bound by the rules that are set in the runtime, one of the current rules is that the BABE pallet assumes that there will be at least one block per epoch. Unless you somehow change the runtime (which you can't do without producing blocks), it is hard to get around this. Currently the only approach to recover from this situation is to "wind back" the local clock and produce blocks in the past so that they are accepted by the runtime. This is a manual and convoluted process, something that we do not want to inflict on our users (there are some pieces of advice on it here: https://github.com/paritytech/substrate/issues/4464).
That said, the end goal is to remove this limitation by allowing BABE to skip epochs entirely, i.e. if we were offline for 2 epochs then we would skip from epoch 2 to 4 when the validators come back online. This would still have security implications since the security model of BABE assumes protocol liveness (otherwise we don't collect entropy from the VRFs), but it would make this error go away for good.