the method weightless uses here is really good! https://forum.pdpatchrepo.info/topic/10745/3-op-fm-synth-with-mod-matrix/3
i opened up that patch and the crux of it is using tabsend~ and tabreceive~ with a block~ 1 1 1 to delay the outputs of each operator by one sample. (i am wondering now if this is a better method to get a one sample delay than using delwrite~ and delread~, i need to do some testing. at the very least, it's wasteful to use a delwrite~ with a buffer of an entire 7 ms)
the tables that tabsend~ and tabreceive~ use store only a single value each.
so each operator receives fm input one sample later than it arrives at the fm input. this is a totally negligible delay for normal fm, and feedback is only possible this way, because the phase can't be calculated and take feedback into account. the feedback must be from 1 sample in the past because otherwise it hasn't been calculated yet.
the $ arguments in the patch make it easier to make separate multiples of things. if you have time to go through the documentation about abstractions and arguments, that will be very useful for synth stuff generally.
i can draft up something that breaks down the tabsend/receive method this evening, but you should spend some time with the patch by weightless because it's great