There is different "level" of cloud build to take into consideration.
If it's the first step, I mean create a ZIP with the code of your function, no problem, you can do it on your side. Then you can deploy the zip through the console or with api calls
In both case, you need a zip and you deploy it. And, if you use the gcloud functions deploy
command, it do exactly the same thing: create a zip, send it to storage and deploy the function from that ZIP!
That's was for the first stage, where you manage the ZIP creation and sending on the cloud.
HOWEVER, to deploy the ZIP code to Google Cloud Platform you need to package that code in a runnable stuff, because you only have a function and a function isn't runnable and can't handle HTTP request.
Therefore, Google Cloud run a Cloud Build under the hood and use Buildpacks to package your code in a container (yes, all is container at Google Cloud), and deploy that container on the Cloud Functions platform.
You can't discard that container creation, without container your Cloud Functions can't run. Or you can use Cloud Run and build your own container on your side and deploy it without Cloud Build.