Taking #241 further, we might be able to get rid of vulture even for dead code detection, since coverage.py can do that more reliably than vulture (which we already use with pytest). That would be a bigger change than #241, but since we already use coverage.py, it wouldn't require taking on anything new.
Note that there is also an older discussion of including this in Ruff directly astral-sh/ruff#872. That would be more similar to Vulture since it would parse the AST looking for dead code, rather than running the code like coverage.py