The question always his how much benefit you get from it and how much time you want to invest into it.
I'm sure you're familiar with
demos, well the main challenge there is to reduce the file size. They often achieve this insanely good, but it's also a lot of work and you really need to know what you're doing, otherwise you'll screw things over quite badly.
Seeing as more and more people are connected with good bandwidth and the harddrive space doesn't matter as much, it seems to me not really worth spending time on reducing file sizes without having a really good reason to do so.
But of course there are many many many tricks you can use to do so. The first step is always to play around with the compiler flags. If you then want to reduce the built in libraries file size, you can go and instead of linking against a static library just add the sources you need to your project. From there you can trim down the class to only the essential stuff and start inlineing and copying code around.
As you might guess at this point things already are quite messy and you lose a lot of the flexibility.
Alternative and/or in addition to messing around with the code directly, you can use a so called packer. Packers take your binary and remove unnessecary stuff and even compress other stuff, thus resulting in quite a small binary.
UPX is well-known for this.
This has the advantage that you don't actually have to mess around with the code (if you don't want to), but can also lead to certain anti-virus applications flagging your application, because viruses etc. use similar approaches and AVs can't detect the difference.