CI: Deploying PHP applications, why build again on the deployment server?

I read this example:

https://docs.gitlab.com/ee/ci/examples/laravel_with_gitlab_and_envoy/index.html

Would it not be preferable to package the source, with the installed vendor folder (and potential node_modules folder) in an artifact, and then copy that all onto the deployment server?

This is instead of doing what the linked tutorial suggests, which is to redo the composer install on the deployment server.

I see an issue with this if the install doesn’t happen the same way as it did in the test environment. The deploy environment will also need to have access to any repositories that are required (might need private access). Composer and NPM (and any other build tools) might fail for whatever reason in the deploy environment when they didn’t in the build environment.

Isn’t the point of CI to build and deploy, not build again on the deployment?

Another issue I see is that the deployment doesn’t link to a specific commit, it only grabs the latest. Does this not break the rollback feature that GitLab has?