I agree with @P_Tigris that using *gosub and *return can help with organizing complex conversations. I also like @Havenstone’s idea of using numeric variables to track relationship status, and am still forming my own similar system.
Sometimes a conversation will need to be only slightly different depending on the situation, and in those cases I like to set up variables that hold the conditional bits of dialogue at the earliest possible time, and then display them later, during the conversation. For example, suppose earlier in the story the main character made a choice regarding a mode of transportation in getting to an important meeting, with corresponding adventures based on the chosen mode of transportation, but now the important meeting is occurring. The main character is late (which you have conveniently set up to be the case regardless of which mode of transportation the main character chose).
Using *if commands, the conversation might look like this (forgive the extra lines between the intended lines):
"You're late," Phillips mutters. "I almost thought you weren't coming."
"Sorry," you say.
*if (transport = "car")
"I was tied up in traffic.
*goto end_transport
*elseif (transport = "bus")
"The bus broke down and we had to wait for another one.
*goto end_transport
*elseif (transport = "bike")
"My bike had a flat.
*goto end_transport
*else
"My car wouldn't start, I missed the bus, and someone stole my bike.
*goto end_transport
*label end_transport
But I'm here now. Let's do this."
The thing is, when the decision was first made as to the mode of transportation, that’s a perfect time to set a variable to use during this conversation. You can then dispense with all of the *if and *elseif commands above. It might look something like this, including the early part of the story where the mode of transportation was chosen:
*temp excuse
In all the excitement, you almost forgot about Phillips.
He'll be expecting to see you soon, and the meeting
place is clear across town. How will you get there?
*choice
#Drive my car
*set excuse "I was tied up in traffic."
*goto car
#Grab a ride on the bus
*set excuse "The bus broke down and we had to wait for another one."
*goto bus
#Ride my bike
*set excuse "My bike had a flat."
*goto bike
#Run
*set excuse "My car wouldn't start, I missed the bus, and someone stole my bike."
*goto run
Some other things happen, and then the meeting occurs…
"You're late," Phillips mutters. "I almost thought you weren't coming."
"Sorry," you say. "${excuse} But I'm here now. Let's do this."
In this particular situation, one might suggest simply doing without the excuse and so avoid using another variable or the block of *if/*elseif commands. But such situational flavor, even when you could do without it, can help give the reader a stronger feeling of control over the story, because it’s clear that the story is still recognizing that earlier choice the reader made.