PIC MCU: Software or hardware delay?
You need to go to the bank (which is just around the corner) and do your laundry. Going to laundry requires you to wait for the washer to finish, and then wait for the the dryer to finish.

How would you go about performing these tasks?

On a lazy day, you could just do the laundry and then go to the bank. It's not that important. Who cares.

But on a busy day, where you have other things to do, like catching a movie, or studying or whatever task, the efficient thing to do is you load the first part of the laundry, then go to the bank, then load the second part of the laundry. Now you are free to do other things. That is maximizing your time so you can do other tasks.

Now for a microcontroller or any embedded system, the same is true. If you don't care about power, time, or anything, then go with a software-driven delay. It's easier to implement, and you can scale it as high as you want with great ease.

If you care about power, time, or efficiency, then a hardware timer is the way to go. While you wait you can either go to sleep or perform another task. It's a bit more complicated to setup, and if multiple tasks require delays, you may run out of hardware timers and then have to resort to a more complicated system of managing time and delays.

If you care about anything other than ease of use: Hardware Timer

If you care only about ease of use: Software