Preheat the oven to 180°C (350°F).
Make the tomato sauce: add the whole peeled tomatoes to a heavy-based pot, squash them with a potato masher or knife, then add the halved white onion, 40–60 g butter, a few pinches of sea salt and some black pepper.
Simmer the sauce over low heat for 45 minutes, stirring occasionally, until reduced and flavorful, then remove and discard the onion halves.
Cook the spinach in a pan or pot until just wilted, then drain well, cool slightly and roughly chop or squeeze to remove excess liquid.
In a large non-stick pan heat 2 Tbsp olive oil and gently sauté the chopped red onion for about 5 minutes until soft but not browned.
Add 2 Tbsp butter and the minced garlic and cook for about 1 minute until fragrant, then sprinkle in 2 Tbsp flour and stir to form a roux; cook briefly.
Gradually add 1/2 cup milk while stirring to create a smooth white sauce; add a little more milk if needed and cook until the flour taste is gone and the sauce has thickened.
Stir the chopped spinach into the white sauce, season with salt, pepper and 1/4 tsp grated nutmeg, and cook until the mixture is a thick, paste-like consistency.
Remove from heat and mix in 250 g ricotta and 3 Tbsp grated Parmesan until well combined and cool enough to handle.
Spread a thin layer of the tomato sauce over the base of a baking dish and scatter some shredded basil leaves over it.
Fill the cannelloni: transfer the spinach-ricotta mixture to a piping bag (or use a spoon). Seal or block one end of each tube with your hand and pipe or spoon the filling into each cannelloni so they are snugly filled.
Arrange the filled tubes tightly in the prepared dish, then pour the remaining tomato sauce evenly over the tubes.
Top with sliced or torn mozzarella, drizzle with a little olive oil, and loosely cover the dish with foil for the first 20 minutes of baking to prevent over-browning.
Bake in the preheated oven for about 1 hour (remove foil for the final portion of baking if needed) until golden and cooked through.
Let the bake rest loosely covered for about 20 minutes, then scatter fresh basil over the top and serve.