There are ways to make nice 3d graphics with low memory footprint, however that requires you to have the right experience and knowledge. There are games like .kkrieger which is a 3d first person shooter, with the size of a few kilobytes.
This is not just compression algorithms. You can't just make a massive game and press a button and suddenly its 100kb, that's not how it works.
Also you have to make the right balance between quality and file size. Sure we all want an HD experience with realistic graphics and very low memory requirements, but the higher quality, the heavier it gets.
Here are a few tricks:
- Procedural generation: The more data you generate on the fly, the less data need to be saved on the disk. Instead of having a massive static world, it's lighter (filesize-wise) to have a randomly generated one.
- Repeating assets: Have objects share the same textures, maybe switch some material settings to make them look different. For example, imagine you have one texture for the ground, one for the walls, and one for the ceiling. You can theoretically make an dungeon roguelike game, that has infinite size, because it keeps adding new rooms that are fully textured.
- Custom Engine: Game engines try to be as abstract as possible, to allow users to create a big variety of games. Unfortunately this comes with an overhead, that can't be avoided. Using a custom engine would ensure that there's not that many unnecessary data, and that everything is optimised to your needs. (Thanks @Sidar)