How do I get a mesh data-block with modifiers and shape keys applied in Blender 2.8?
Just tested batFINGER's solutions. It's pretty convoluted and you have to call bm.clear() every time the mesh updates before calling the last two functions. It works but really doesn't feel like the intended way to do things. Digging a bit further I think I found the intended solution:

#We only have to do this once:
ob = bpy.context.active_object #getting the object we want.
dg = bpy.context.evaluated_depsgraph_get() #getting the dependency graph

#This has to be done every time the object updates:
ob = ob.evaluated_get(dg) #this gives us the evaluated version of the object. Aka with all modifiers and deformations applied.
me = ob.to_mesh() #turn it into the mesh data block we want.


Still annoying that we can't pick between preview and render for which version of the modifiers it applies (it seems to always pick preview). If there is a way to do that I would love to know.