I think I just figured out why my drone was doing what you described here while taking off in NAV: I was using the rotorcraft_basic.xml flightplan as a basis for my flightplan, and here's what the Takeoff block looked like:
<block name="Takeoff" strip_button="Takeoff" strip_icon="takeoff.png">
<exception cond="stateGetPositionEnu_f()->z > 2.0" deroute="Standby" />
<call fun="NavSetWaypointHere(WP_CLIMB)" />
<stay climb="1.0" vmode="climb" wp="p1" />
As far as I understand, this moves the CLIMB waypoint to the drone's current location, and then attempts to climb to waypoint P1 at a rate of 1m/s until the drone reaches an altitude of 2 meters, at which point control switches to the Standby block.
The problem for me was that P1 was not near the drone's starting point, and the drone was trying to make a sharp turning maneuver while still on the ground, causing all sorts of ground encounter issues.
Changing the stay element to:
<stay climb="1.0" vmode="climb" wp="CLIMB" />
fixed the issue I was having with takeoff, and allowed the drone to finally takeoff cleanly, climb to its target altitude and move to the Standby block. I also changed the standby block so that it stays at the CLIMB waypoint, instead of P1.
This was the first time I was able to fly the drone completely autonomously with Paparazzi. Once the drone was off the ground, it seemed to navigate between waypoints and land perfectly fine. I have to say that flying is a lot more satisfying than crashing...