Well the language choice does make a big difference.
Python has the GIL meaning parallelism comes at the cost of increased memory and CPU consumption because it's typically going to spin up multiple copies of the Python interpreter and your application. This is also true of Ruby, so it applies both to Gitlab and Quay.
Quay uses Gunicorn which uses pre-fork model which means spinning up multiple processes of Quay which can lead to increased CPU and memory requirements. Obviously you need multiple cores to take proper advantage of multiple processes, and multiple processes each result in multiple copies of the same application running, thus more memory.
This is kind of a fact of using something like Python or Ruby unless you design your application to use an event driven architecture with something like twisted, tulip, async, tornado, etc. Even then, unless you have async versions of the libraries your using (eg: your DB driver) that won't necessarily remove your need for multiple processes.