Heat olive oil in a large deep skillet over medium heat. Add onion and a pinch of salt. Cook for 3 to 4 minutes until softened.
Add garlic and cook for 30 seconds.
Add tomatoes, Italian seasoning, and smoked paprika. Cook for about 3 minutes until the tomatoes begin to soften.
Stir in the dry orzo and toast for 1 minute.
Mash about a third of the cannellini beans with a fork, then add them along with the remaining whole beans and the vegetable broth. Bring to a gentle boil.
Reduce heat to medium-low and simmer uncovered for 9 to 11 minutes, stirring often.
When the orzo is nearly tender, stir in milk and chopped spinach. Cook for 1 to 2 minutes.
Remove from heat and stir in Parmesan until melted.
Add lemon juice and basil. Taste and adjust salt and pepper.
Rest for 2 minutes, then serve with extra Parmesan and basil if desired.