I usually just keep separate columns , do copies , do boolean union of them , make vertex auto merge by small distance to weed off redundant vertexes , make the intersecting edge split , then transfer normals from original columns to each split mesh accordingly . No shading artifacts at all . Done. Always perfect shading…