[Greenify] Lusty Rugnuts:
I'm going to try the following:

This disables Google Play Services from resetting your Doze settings.

adb shell "su -c 'pm disable --user 0 com.google.android.gms/.phenotype.service.sync.PhenotypeConfigurator'"

This shows you your current Doze settings:

adb shell dumpsys deviceidle

This resets the doze settings to blank.

adb shell settings delete global device_idle_constants

This disables Light Doze.

adb shell dumpsys deviceidle disable light

This sets the Device Idle Constants. My main aim is to progress to Deep Doze as quickly as possible after the screen goes off.

adb shell settings put global device_idle_constants light_after_inactive_to=0,light_pre_idle_to=0,light_idle_to=0,light_idle_factor=2.0,light_max_idle_to=0,light_idle_maintenance_min_budget=0,light_idle_maintenance_max_budget=0,min_light_maintenance_time=0,min_deep_maintenance_time=0,inactive_to=0,sensing_to=0,locating_to=0,location_accuracy=1000.0,motion_inactive_to=86400000,idle_after_inactive_to=0,idle_pending_to=0,max_idle_pending_to=0,idle_pending_factor=2.0,idle_to=86400000,max_idle_to=172800000,idle_factor=2.0,min_time_to_alarm=1000,max_temp_app_whitelist_duration=0,mms_temp_app_whitelist_duration=0,sms_temp_app_whitelist_duration=0,notification_whitelist_duration=0

Device Idle Constants:

[B]light_after_inactive_to[/B]
This is the time, after becoming inactive, that we go in to
the first light-weight idle mode.

[B]light_pre_idle_to[/B]
This is amount of time we will wait from the point where we
decide we would like to go idle until we actually do, while
waiting for jobs and other current activity to finish.

[B]light_idle_to[/B]
This is the initial time that we will run in idle maintenance
mode.

[B]light_idle_factor[/B]
Scaling factor to apply to the light idle mode time each time
we complete a cycle.

[B]light_max_idle_to[/B]
This is the maximum time we will run in idle maintenence mode.

[B]light_idle_maintenance_min_budget[/B]
This is the minimum amount of time we want to make available
for maintenance mode when lightly idling. That is, we will
always have at least this amount of time available maintenance
before timing out and cutting off maintenance mode.

[B]light_idle_maintenance_max_budget[/B]
This is the maximum amount of time we want to make available
for maintenance mode when lightly idling. That is, if the
system isn't using up its minimum maintenance budget and this
time is being added to the budget reserve, this is the maximum
reserve size we will allow to grow and thus the maximum amount
of time we will allow for the maintenance window.

[B]min_light_maintenance_time[/B]
This is the minimum amount of time that we will stay in
maintenance mode after a light doze. We have this minimum to
allow various things to respond to switching in to
maintenance mode and scheduling their work -- otherwise we may
see there is nothing to do (no jobs pending) and go out of
maintenance mode immediately.

[B]min_deep_maintenance_time[/B]
This is the minimum amount of time that we will stay in
maintenance mode after a full doze. We have this minimum to
allow various things to respond to switching in to
maintenance mode and scheduling their work -- otherwise we may
see there is nothing to do (no jobs pending) and go out of
maintenance mode immediately.

[B]inactive_to[/B]
This is the time, after becoming inactive, at which we start
looking at the motion sensor to determine if the device is
being left alone. We don't do this immediately after going
inactive just because we don't want to be continually running
the motion sensor whenever the screen is off.

[B]sensing_to[/B]
If we don't receive a callback from AnyMotion in this amount
of time + LOCATING_TIMEOUT, we will change from STATE_SENSING
to STATE_INACTIVE, and any AnyMotion callbacks while not in
STATE_SENSING will be ignored.

[B]locating_to[/B]
This is how long we will wait to try to get a good location fix
before going in to idle mode.

[B]location_accuracy[/B]
The desired maximum accuracy (in meters) we consider the location
to be good enough to go on to idle. We will be trying to get an
accuracy fix at least this good or until LOCATING_TIMEOUT expires.

[B]motion_inactive_to[/B]
This is the time, after seeing motion, that we wait after becoming
inactive from that until we start looking for motion again.

[B]idle_after_inactive_to[/B]
This is the time, after the inactive timeout elapses, that we will
wait looking for motion until we truly consider the device to be
idle.

[B]idle_pending_to[/B]
This is the initial time, after being idle, that we will allow
ourself to be back in the IDLE_MAINTENANCE state allowing the
system to run normally until we return to idle.

[B]max_idle_pending_to[/B]
Maximum pending idle timeout (time spent running) we will be
allowed to use.

[B]idle_pending_factor[/B]
Scaling factor to apply to current pending idle timeout each time
we cycle through that state.

[B]idle_to[/B]
This is the initial time that we want to sit in the idle state
before waking up again to return to pending idle and allowing
normal work to run.

[B]max_idle_to[/B]
Maximum idle duration we will be allowed to use.

[B]idle_factor[/B]
Scaling factor to apply to current idle timeout each time we cycle
through that state.

[B]min_time_to_alarm[/B]
This is the minimum time we will allow until the next upcoming
alarm for us to actually go in to idle mode.

[B]max_temp_app_whitelist_duration[/B]
Max amount of time to temporarily whitelist an app when it
receives a high priority tickle.

[B]mms_temp_app_whitelist_duration[/B]
Amount of time we would like to whitelist an app that is receiving
an MMS.

[B]sms_temp_app_whitelist_duration[/B]
Amount of time we would like to whitelist an app that is receiving
an SMS.

[B]notification_whitelist_duration[/B]
Amount of time we would like to whitelist an app that is handling
a PendingIntent triggered by a Notification.

You can also force Android into Deep Doze manually: adb shell dumpsys deviceidle force-idle

I've also set 3C CPU Manager to force 6 CPU cores offline when the screen is off, and to force the other 2 cores to a maximum 299 MHz.

If that doesn't work the way I want, there's always https://f-droid.org/packages/com.suyashsrijan.forcedoze/.

{UPDATE}

So I got rid of Greenify and Nova Launcher. I replaced Greenify with the settings above, and I replaced Nova Launcher with OpenLauncher. I've disabled pretty much everything in OpenLauncher, so the screen is completely empty... the only thing I use it for is the app drawer, and I've set that to have a black background.

[IMG="OpenLauncher App Drawer, black theme"]https://i.imgur.com/E86WFKn.png[/IMG]

Before, AFWall+ would be constantly popping up toast messages that it's blocked communication for Google components (because both Greenify and Nova Launcher used Google components such as Firebase, Tag Manager, Crashlytics, etc.)... now I get a couple messages after boot that the kernel tried to connect, and after that, it's silent.

{/UPDATE}