The same code gets run when the Arduino resets, whether from power on, pressing the reset button, opening the serial port, or poor code causing a reset.
So, no, when the Arduino starts up, you can not tell why.
This begs the question, why does it have to be reset?
Well a reset (at least power-up or manual/auto reset) is required to activate the Arduino bootloader program. But if your point is that good program structure should not require a 'running reset', I agree.
I guess one exception would be if the watch dog timer was being utilized, but there is a way to determine in code if the watch dog timer did the biting.