Thanks for the instructive example. I've set it up for my TWR-K64 board, to test the outputs and timing. Below is what I found, along with some proposed solutions.
Initial test

Running your code exactly as you attached it produces the above results. How did you generate your figures? Are those measured signals on an oscilloscope, or is it a simulated output? Anyway, there are two major problems with this code:
- Setting up the Output Compare with kFTM_NoOutputSignal causes the signal to decay.
- The FTM_SetSoftwareTrigger() call restarts the FTM counter at 0, so the CH1 period is not consistent if a trigger event occurs during the a given FTM cycle. This is because the FTM module is initialized with SWRSTCNT = 1.
First fix: don't use kFTM_NoOutputSignal

Instead of using kFTM_NoOutputSignal, I simply set up the Output Compare with whatever state the output is currently in. For example, if the output is in the high state, I call:
FTM_SetupOutputCompare(BOARD_FTM_BASEADDR, BOARD_FTM_OUT_CHANNEL, kFTM_SetOnMatch, compareValue);
And similarly if the output is in the low state, I use kFTM_ClearOnMatch. Since the compareValue is greater than MOD, these commands don't actually cause "set" or "clear" operations, but they do seem to prevent the signal droop shown in the first figure.
I'll note that I also found that this extra call to FTM_SetupOutputCompare(), in which a compareValue > MOD is used, is unnecessary. It simply changes the total delay between rising and falling edges out the Output Compare channel (since it involves a couple extra instructions).
Second fix: SWRSTCNT = 0
The documentation for the SWRSTCNT bit isn't very clear, but according to AN5142 (Features of the FlexTimer Module): "If the SWRSTCNT bit is set, the FTM counter restarts with FTM_CNTIN register value and the FTM_MOD and FTM_CnV registers are updated immediately. If the SWRSTCNT bit is cleared, the FTM counter continues to count normally and the FTM_MOD and FTM_CnV register update at the next loading point."
This suggests that the initial state of SWRSTCNT = 1 is the issue. As you can see from the first two figures, any time a GPIO toggle occurs, the FTM counter is restarted, and the PWM period is irregular.

Setting SWRSTCNT = 0 does fix the periodicity of the FTM0_CH1 PWM output (above). However, it also causes the Output Compare setup to never occur, and so the FTM0_CH0 output remains stuck in a low state.
Third fix: set up loading points at CNTMIN and CNTMAX
By default, the FTM is initialized with FTM_SYNC = 0b1000, (or SYNCHOM = 1, REINIT = 0, CNTMAX = 0, and CNTMIN = 0). With SWRSTCNT = 0, the FTM_SetSoftwareTrigger() no longer caused an immediate update of the CnV register, so I had to enable loading points. After setting CNTMIN = 1 and CNTMAX = 1, I found the following behavior:

As you can see, the FTM0_CH0 output compare toggle always happens one FTM cycle after the output compare is set up. This is the desired and expected behavior with SWRSTCNT = 0, along with CNTMIN = 1 and CNTMAX = 1. So this all looks great.
But the issue remains for my DDS project:
However, I tried to use the same FTM initialization for my DDS code in another project, and I no longer see the desired/expected behavior. As shown below, the SetOnMatch behavior is inconsistent. Sometimes, as in Fig. 1 the SetOnMatch occurs in the same period as FTM_SetupOutputCompare(). And other times, as in Fig. 2, the SetOnMatch occurs in the next FTM cycle (after ISR2).

I don't understand this non-deterministic behavior. As best I can tell, I have the FTM initialized the same way for both projects. That is:
FTM_MODE = 5 (0b101)
FTM_SYNC = 11 (0b1011)
FTM_COMBINE = 538976288 (0b100000001000000010000000100000)
FTM_SYNCONF = 7860 (0b1111010110100)
So again, I'm at an impasse as to why my code is behaving incorrectly.