I have used Virtualbox for virtualization for ages. It more or less works without a problem, independent of guest or host OS.
Have several times tried to switch to Bhyve, since its part of freebsd's base install. Every time i have run into some kind of problem, the latest times it has been guest networking not working. So i have kept using virtualbox. Have read this blog, several times, but guess i have missed some step https://vermaden.wordpress.com/2023/08/18/freebsd-bhyve-virtualization/. Did not get it working unfortunately, but in the end, reading also this, https://it-notes.dragas.net/2024/11/15/migrating-windows-vms-from-bios-kvm-to-uefi-bhyve/ helped me, with the pf.conf

Now im in the bhyve.
Host configs
/etc/resolv.conf
nameserver 192.168.0.1
search 192.168.0.1

/etc/rc.conf
keymap="us.macbook.kbd"
hostname="melee"
sshd_enable="YES"
moused_enable="YES"
ntpdate_enable="YES"
ntpd_enable="YES"
powerd_enable="YES"
dumpdev="AUTO"
zfs_enable="YES"

ifconfig_re0="inet 192.168.0.61 netmask 255.255.255.0"
defaultrouter="192.168.0.1"
sendmail_enable="NONE"
gateway_enable="YES"
pf_enable="YES"
ifconfig_bridge0="inet 192.168.3.1 netmask 255.255.255.0 addm re0 addm tap0 up"
ifconfig_tap0="create up"
routes_bridge0="default via 192.168.0.1"
routes_tap0="default via 192.168.0.1"
cloned_interfaces="tap0 bridge0"
bridge_forward_delay_bridge0=0
bridge_hello_time_bridge0=1000

/etc/pf.conf
extif="re0"
set block-policy return
set skip on bridge0
set skip on lo0
nat on $extif from {192.168.3.0/24} to any -> ($extif)
antispoof for $extif inet
pass in inet proto icmp
pass out quick keep state
pass in inet proto tcp from any to any port ssh flags S/SA keep state

/boot/loader.conf
kern.geom.label.disk_ident.enable="0"
kern.geom.label.gptid.enable="0"
cryptodev_load="YES"
zfs_load="YES"
if_re_load="YES"
if_re_name="/boot/modules/if_re.ko"
vmm_load="YES"

/etc/sysctl.conf
vfs.zfs.min_auto_ashift=12
#pass in on vm-public
net.inet.ip.forwarding=1
net.inet.ip.fastforwarding=1
net.link.tap.user_open=1
net.link.tap.up_on_open=1


Guest configs
/etc/rc.conf
hostname="ghost4"
ifconfig_vtnet0="inet 192.168.3.2 netmask 255.255.255.0"
defaultrouter="192.168.3.1"
sshd_enable="YES"
dumpdev="AUTO"
zfs_enable="YES"
gateway_enable="YES"

/etc/resolv.conf
nameserver 192.168.0.1
search 192.168.0.1

/boot/loader.conf
kern.geom.label.disk_ident.enable="0"
kern.geom.label.gptid.enable="0"
cryptodev_load="YES"
zfs_load="YES"

/etc/sysctl.conf
vfs.zfs.min_auto_ashift=12


To create a bhyve virtual image and install guest OS
doas kldload vmm
For every virtual machine, change the 0 to the next free number
doas ifconfig tap0 create
doas ifconfig bridge0 create
doas ifconfig bridge0 addm re0 addm tap0 (re0 is physical interface)
doas ifconfig bridge0 up
truncate -s 50G guest.img
doas sh /usr/share/examples/bhyve/vmrun.sh -c 4 -m 6G -t tap0 -d guest.img -i -I FreeBSD-13.3-RELEASE-amd64-disc1.iso guest
doas sh /usr/share/examples/bhyve/vmrun.sh -c 4 -m 6G -t tap0 -d guest.img guest


So that should be what you need to do. Have not yet gotten graphical installs working and linux. Dont think i see that as a problem though, bhyve has arguments for the graphical part.

------ EDIT -------

created a script to add more virtual guests more easily
!#/bin/sh
# Doas this
# doas sh addvirnet.sh 2 guest /path/to/freebsd.iso
# arg1=guest number
# arg2=guest name both img and name
# arg3=iso path
TAP=tap$1
echo "" >> /etc/rc.conf
echo "# Guest$1" >> /etc/rc.conf
echo "ifconfig_$TAP=\"create up\"" >> /etc/rc.conf
echo "routes_$TAP=\"default via 192.168.0.1\"" >> /etc/rc.conf

X=`grep ^cloned_interfaces /etc/rc.conf`
Y=`echo $X | sed -r "s/(.*)\"/\1 $TAP\"/"`
sed -ie "s@^cloned_interfaces=.*@$Y@" /etc/rc.conf

X=`grep ^ifconfig_bridge0 /etc/rc.conf`
Y=`echo $X | sed -r "s/(.*)up\"/\1addm $TAP up\"/"`
sed -ie "s@^ifconfig_bridge0=.*@$Y@" /etc/rc.conf

service netif restart

truncate -s 50G $2.img
sh /usr/share/examples/bhyve/vmrun.sh -c 4 -m 6G -t $TAP -d $2.img -i -I $3 $2
sh /usr/share/examples/bhyve/vmrun.sh -c 4 -m 6G -t $TAP -d $2.img $2