Environment approvals work per-stage. Split your jobs into separate stages:
- stage: development
condition: contains(variables['Build.SourceBranch'], 'refs/heads/develop')
- deployment: Deploy_Dev
displayName: 'Deploy Develop to Dev Machine'
Your use case is very simple, so relying on GIT_STRATEGY=fetch is probably sufficient and as you said the default behavior.
You should be cautious using artifacts unnecessarily as they are uploaded to the gitlab server.
The answer to your question generally depends on a few things, like the size of your repository, network connection, runner executor type, ...