I haven't personally used it, but I have seen cage [0] being recommended a few times for similar use-cases.
id:5:initdefault:
x1:5:respawn:/etc/rc-x11
ff:5:respawn:/etc/rc-firefox
...where /etc/rc-∗ are few lines of shell that set up environment variables, and end with "exec chroot --userspec=... / /bin/firefox ..." - this way X and firefox run under same PIDs that sysvinit knows about, so they get restarted after a crash.