One could also use docker Jenkins LTS. If one wants to start from scratch, just remove the mounted Jenkins home folder and there will be a clean Jenkins in no time.
One possible approach, although a bit tedious (and a bit dumb), would be to:
make a fresh Jenkins installation of the exact same version on another (maybe scrappable) machine
get the list of the (default) plugins it ends up with
add/remove/update the plugins in the original Jenkins installation to match that list
One could use ansible geerlingguy.jenkins role. When this role is applied, a Jenkins system will be created without any plugins. Subsequently, one could install plugins manually, but also define them in ansible, i.e. plugins as code.
I find it strange that nobody mentioned the Configuration as Code plugin. Our solution to this problem is to maintain a base Docker image for jenkins, provisioned with two config files:
The plugins are installed by the install-plugins.sh script provided by the base Jenkins image:
COPY casc_configs/plugins.txt /usr/share/jenkins/ref/...