In a large pot, heat oil and butter over medium heat until butter melts and begins to bubble. Add diced onions and stir constantly until lightly browned, about 20 minutes.
While onions are cooking, use this time to crush the tomatoes. Open the 28-ounce can of San Marzano tomatoes and empty the contents into a large bowl. Use your hands to crush the tomatoes into a pulp. This is a fun activity to do with your kids! Set crushed tomatoes to the side.
After the onions have browned, add minced garlic and saute until lightly browned, about another minute or two.
Add in tomato paste and stir for another minute.
Add chicken stock, salt, pepper, and cayenne. I don't like heat so I only added 1/8 teaspoon for flavor. If you want more spice, add 1/4 teaspoon in total. Stir in crushed tomatoes.
After you've added the tomatoes, place lid on the pot and raise temp to about medium-high so that the soup begins to boil. Once boiling, reduce to medium-low so it begins to simmer. Allow it to simmer for 10-15 minutes to develop the flavors.
Once the soup has simmered, use an immersion blender to puree the onions and tomatoes until smooth. If you don't have an immersion blender, I recommend a great one above. If you don't want to buy one, you can use a normal blender. But you will probably have to blend in stages so the soup doesn't overflow in the blender pitcher. And you MUST hold your hand on top of the blender to prevent the lid from coming off when the steam wants to escape. If you like your soup chunky, only puree until you get the consistency you desire.
Add cream and chopped basil and raise temperature to medium. Heat the soup through so it is at the desired serving temperature, about 5-10 minutes.
Serve with your favorite grilled cheese. We love to make dunkable grilled cheese, which is just a rolled-up grilled cheese. I recommend a quick and easy recipe in the notes below. Enjoy!