Unless you know roughly what the layers of abstraction your app build on are doing, you're going to have a very tough time getting anything done. What better way to learn how compilers work than by writing a throwaway compiler yourself? In the end, you're going to be a better judge of existing tools because you will know, roughly, what they're doing inside that black box.
Of course, for production level code, reinventing the wheel is the worst thing you can do -- unless you can prove that your particular realization of the wheel is better than what already exists.
If people did not reinvent wheels all the time, our wheels would still be round blocks of stone.
Sure on a purely dictionary scale "reinventing the wheel" means to reproduce a tool that exists with little to no extra benefit. More often than not, however it's used to down play the achievements or ideas of others.
I'm the kind of guy who believes that any (even little) benefit is a reason to reinvent something.