It may not be strictly necessary for a low power machine to have limit switches, but the provision must be made in the controller software for them just the same, just in case you are running a more powerful system (or less sturdily built one) that would be damaged by a crash. It just makes good sense to take whatever steps can be taken to protect the machine from potential mechanical damage.
If possible in software, it is better for the machine to accurately know its position at all times, including when it has run out of travel. A limit switch provides a means of cutting off the power to the motor, with a little bit of room for the axis to continue to decelerate to a stop. On a closed loop system, the controller will still know the exact position of the motor and permit backing off of the limit without actually re-homing the machine.