Cook bacon: Add the chopped bacon to a large skillet and set over medium-high heat. Once the bacon is hot and sizzling, reduce heat to medium-low and cover with a lid. Cook low and slow, stirring occasionally. Once the bacon pieces are golden and release their grease, remove the lid and allow them to cook until the desired doneness is reached. Remove the bacon using a slotted spoon to a plate lined with paper towels. Set aside. Reserve bacon grease.
Cook vegetables: Add one tablespoon reserved bacon grease (or olive oil if you're cooking this recipe without bacon) to a large stockpot set over medium heat. Add the onions and sauté for 3-4 minutes, stirring often. Add the carrots and celery and continue to cook, stirring often, for an additional 6-8 minutes, or until vegetables have softened. Mix in the minced garlic and approximately 1 teaspoon salt and cook for 1 minute, stirring constantly.
Add the potatoes and cauliflower: Add the cauliflower and diced potatoes to the pot. Mix well to combine and add the veggie broth (or water). Cover with a lid and bring to a boil over medium-high heat. Reduce heat to low and allow the vegetables to simmer until very soft.
Create the roux: Melt the butter in a separate, smaller saucepan, over medium heat. Once melted, slowly add the flour, whisking continuously until fully incorporated. Still whisking, slowly add the milk, stirring constantly until fully combined and starting to thicken and bubble. Remove from heat.
Combine soup and roux: Once the potatoes and vegetables are completely softened, stir in the prepared roux, mixing well to combine.
Blend: Transfer soup to a large high-speed blender and blend until smooth and creamy, or, use a sturdy hand-held immersion blender to puree vegetables until desired consistency is reached. Stir in the half and half.
Season and serve: Season with additional salt and pepper, to taste. Serve garnished with cooked bacon bits, green onions, shredded cheese, and sour cream. Enjoy!