Long story short: as you clearly identified it, this is an uninitialized register. As such, any decent simulator will see it as "X" (unknown state).
But synthesized on a given FPGA - it depends! Many FPGAs just reset all flip-flops right after configuration, so if not explicitely initialized, they are likely to start with a value of zero. When this is not the case, obviously on real hardware, any register WILL have a value, even if it's not zero, so the design per se can't be stuck (whereas in simulation, if a register is X, then incrementing it will have no visible effect (will keep being X until explicitely assigned a value.)
Some FPGAs/vendor tools allow explicitely initializing registers/signals within the HDL code (as suggested above). This approach will work both in simulation and on many (but not all) FPGAs.
Otherwise, the proper way of dealing with initialization would be to implement a reset state in your code.
Then whether you *really* need to initialize a given register/signal depends on your design. It's not necessarily the case. At least not necessarily at a common "reset" event. You don't need to initialize a signal early if it's going to be used many clock periods after a "reset" for instance. You can assign it an initial value in some kind of FSM instead for instance. Or, in some cases you actually don't care about the initial value. Say you're using a counter to flash a LED or something - initializing the counter may not matter as you may not care about the very first "flash" period.
But as I said first, if you don't initialize a given signal, you may still have simulation issues - so all in all, the common approach to this is - either you initialize it upon a "reset" state (asynchronous or synchronous), or initialize it at the declaration level - then it's likely to work on many FPGAs, and even if it doesn't (and as long as it doesn't matter), it will at least make the simulation work.