Upfront: I used to be a core dev on freepbx, but moved to another company, and unfortunately don't have time for it anymore.
It really depends on your style. Certainly, by hand, you get a ton of control. However, you also have to consider what you are trying to accomplish. In the end, an office PBX generally needs to work in a certain way, and there a bunch of baseline services you need to provide. Writing by hand, you'll end up re-inventing the wheel, writing all those little services and things that every PBX needs to have.
When you use the GUI, you're using code where those things are already written, and collectively the community has figured out the gotchas and has knowledge of what works vs what doesn't. It's also frankly, much faster to do common tasks like setting up a new extension using a GUI, rather than a bunch of config files -- especially if you haven't done it in a few months -- because the GUI is intuitive and easy to pick back up.
As far as customization, writing by hand you no doubt can do whatever you want. However, freepbx in particular allows for quite a bit to be done via plugins - a plugin can more or less modify any part of the dialplan. There is a layer of abstraction from pure asterisk dialplan code, so if you know asterisk already, you'll have to re-learn some of this, but it's not that big a leap.
There's also nothing stopping you from adding your own custom apps (written by hand) when you do need to deviate from stock PBX functionality, and freepbx makes it easy to reference those from the GUI, seamlessly tying them in like a native app (either via plugins, or just custom actions).
I originally got involved with Freepbx because I was setting up an office PBX, and I'm lazy - adding extensions by hand, and remembering to add appropriate hooks to go to voicemail, and enable other features etc, is repetitive, boring, and error-prone (eg "whoops, bob's extension goes to dave's voicemail? sorry, it was a typo!").
I can't speak for every GUI, but I would not suggest using freepbx to generate config files with the goal of later editing them by hand: it is designed to be efficient for asterisk and the plugin code, not human-readable. (eg, it sometimes repeats chunks of code instead of using a macro). On top of that, if you ever generate configs via freepbx again, you'll lose any changes you made to the auto-generated files.
Sure, editing by hand will yield a more efficient dialplan in the end, just like writing programs by assembly is more efficient for the CPU than writing in C++. You have to consider what is more valuable - $100 for a bigger CPU, or many (potentially hundreds of) hours of your time?
It'd be interesting to hear your experiences, now that it's a couple months later.