Lighttpd has been my choice to serve FreePBX for years. It did a great work and was ideal to separate normal, pre-existing web services running in Apache with the Apache user etc., from FreePBX, which had at least to be run as the asterisk user. An advantage of such an approach is that, for example, you do not have to change the Apache MPM, wich ca have performance implications (ok, if I ran a web service which has performance requirements, even me would not install Asterisk on it:)

I must say that I did not really test it in the current environment yet, with CentOS 8, Asterisk 18 and FreePBX 16. The last time I really used it was on CentOS 7 with Asterisk 11 and FreePBX 12. From a quick test with a spare C8 VM, they seem to still work, at the least I was able to see the FreePBX dashboard, login, reload etc. So I write down these notes just to give an idea of what has to be done.

A word of caution, I never run this under SELinux, so if you do, take a special ook at /var/log/audit/audit.log.
And obviously lighttpd does not handle .htaccess files. So you'll have to adapt them, if you want/need, to the Lighttpd config.

First install lighttpd: dnf install lighttpd-fastcgi

Then create the file with our instance of lighttpd:

cat > /etc/lighttpd/freepbx.conf <<"EOF"
server.modules              = (
                                "mod_access",
                                "mod_auth",
                                "mod_fastcgi",
                                "mod_cgi",
                                "mod_accesslog" )

server.document-root        = "/usr/share/freepbx"

server.errorlog             = "/var/log/asterisk/freepbx/error.log"
accesslog.filename          = "/var/log/asterisk/freepbx/access.log"

index-file.names            = ( "index.php", "index.html", "index.htm" )

include "conf.d/mime.conf"

static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )

server.port                = 81
server.pid-file            = "/var/run/freepbx.pid"
server.username            = "asterisk"
server.groupname           = "asterisk"

fastcgi.server             = ( ".php" =>
                               ( "localhost" =>
                                 (
                                   "socket" => "/var/run/asterisk/php-fastcgi.socket",
                                   "bin-path" => "/usr/bin/php-cgi"
                                 )
                               )
                            )

cgi.assign                 = ( ".pl"  => "/usr/bin/perl" )

url.access-deny             = ( "~", ".inc" )

$HTTP["url"] =~ "\.pdf$" {
  server.range-requests = "disable"
}

$HTTP["remoteip"] !~ "127\.0\.0\.|192\.168\." {
  $HTTP["url"] =~ "^/(admin|meetme|recordings|panel)/" {
    url.access-deny = ( "" )
  }

  $HTTP["url"] =~ "^/" {
    url.access-deny = ( "" )
  }
}

# use if you want HTTP authentication too
#auth.backend               = "htdigest"
#auth.backend.htdigest.userfile = "/etc/freepbx/freepbx_web_users"
#
#$HTTP["url"] =~ "^/(admin|meetme|recordings|panel)/" {
#  auth.require = ( "" =>
#    (
#      "method"  => "digest",
#      "realm"   => "FreePBX",
#      "require" => "valid-user"
#    )
#  )
#}
EOF


Warning: see the line with "admin|meetme|recordings|panel". These paths are from an old FreePBX version. Maybe they changed, a lot.
If you're going to use lighttpd, please have a look and adapt it.

Then create the systemd unit file. Double check it, it was done for an old server.

cat > /etc/systemd/system/lightfreepbx.service <<"EOF"
[Unit]
Description=FreePBX Web interface
After=network.target

[Service]
# To be created by lighttpd (option server.pid-file)
PIDFile=/var/run/freepbx.pid
EnvironmentFile=-/etc/sysconfig/freepbx
ExecStart=/usr/sbin/lighttpd -D -f /etc/lighttpd/freepbx.conf

[Install]
WantedBy=multi-user.target
EOF

Create an empty sysconfig file, just in case
> /etc/sysconfig/freepbx

# Somewhere for the logs
mkdir /var/log/asterisk/freepbx
chown asterisk:asterisk /var/log/asterisk/freepbx

Than as for any service,
systemctl daemon-reload
systemctl enable --now lightfreepbx


Again, maybe these notes might be incomplete and/or outdated. But they should give an idea. I tried them now and at least, they gave me the FreePBX slplash screen.
Feel free to write me suggestions, corrections, etc.
