Well, to understand the reason of having this return in recursion you can think of basics of function call/stack-frame:
We need return statements to pass a value back to the immediate caller of the current function's call-frame. This immediate caller can be another invocation of that same function in case of recursions.
If the return value of a function you called (be it recursive or normal) is not used, either that return value gets discarded or it is a error in many languages. In some cases, the return value of the last function call gets automatically re-used as the return value of the current function invocation. That is why you may see undefined behavior and t prevent this some intelligent compilers do warn about it.
Recursion calls should have:
Base case: Some condition for which we have a solution and a return value. There can be more than one base cases.
Algorithm or logic to get closer to our base case (i.e breaking down original problem to simpler problem).
Recursive call which passes the simpler problem back into the function.
So in this case, your base case is (x>=5), logic to get closer to the base case is (x++) and recursive call is addup with argument x. But you do not save the return value here which may be discarded or lost and thus can cause further issues and thus it should be dealt properly as:
return addup(x);
I hope it makes sense now.