A page that renders in 80ms on the host takes two seconds inside the box, the guest CPU is idle and the database is not the problem. VirtualBox shares the project directory through a userspace filesystem driver, and a framework that stats a few thousand files per request pays the crossing cost on every one of them.
# Vagrantfile — the default, and the reason it is slow
config.vm.synced_folder ".", "/var/www/app"
# NFS: the host exports, the guest mounts through the kernel client.
# Needs a private network and a sudo password on every `vagrant up`.
config.vm.network :private_network, ip: "192.168.56.20"
config.vm.synced_folder ".", "/var/www/app", type: "nfs"
# rsync (Vagrant 1.5 and later): a one-way copy at boot, kept current
# by `vagrant rsync-auto`. The guest reads local disk and shares nothing.
config.vm.synced_folder ".", "/var/www/app", type: "rsync",
rsync__exclude: [".git/", "node_modules/", "storage/logs/"]
NFS is the usual answer and it is a real fix — the same page comes back under 200ms — at the price of a host-only network, a sudo prompt to rewrite /etc/exports, and a class of stale-handle errors when the host sleeps with the box running. The rsync type is faster again, because nothing is shared at all and the guest is reading its own disk; the cost is that the copy is one-way, so anything the box writes — compiled assets, a generated migration, a composer.lock — has to be pulled back deliberately. Exclude .git and the dependency trees whichever type you choose. On most projects those directories are the majority of the file count and none of the work.