Place the rice in a fine-mesh strainer and rinse under cold running water until the water runs clear. This helps remove excess starch and prevents the pudding from becoming too thick.
In a large saucepan, combine the rinsed rice, water, cinnamon stick, and lemon or orange zest if using. Bring to a boil over medium-high heat. Reduce the heat to low, cover, and simmer for about 10 minutes, or until most of the water is absorbed.
Stir in the whole milk. Increase the heat to medium and bring the mixture back to a gentle boil, stirring frequently to prevent sticking.
Reduce the heat to low and simmer uncovered for 25-30 minutes, stirring occasionally, until the rice is tender and the mixture has thickened.
Remove the cinnamon stick and citrus zest from the saucepan. Stir in the granulated sugar, vanilla extract, and salt. If adding raisins or dried cranberries, stir them in now.
Continue to cook for another 5 minutes, stirring constantly until the sugar is fully dissolved and the pudding reaches your desired consistency.
If the pudding is too thick, add a little more milk to reach your preferred texture. Keep in mind that it will thicken further as it cools.
Remove from heat and let it cool slightly. Spoon the arroz con leche into individual serving bowls or cups. Sprinkle ground cinnamon on top for garnish.
Arroz con Leche can be enjoyed warm, at room temperature, or chilled. If refrigerating, cover the surface with plastic wrap to prevent a skin from forming.