Why does operators bl_idname have to contain 1 dot?
This rule may seem arbitrary, but looks like there's already some structure in existing operator's names. All registered operators will end up within bpy.ops module, and we can see that identifiers directly under it is reserved for modules/namespaces further categorizing the operators:


bpy.ops.action for animation data,
bpy.ops.object for object, regardless of data type,
bpy.ops.ui for user interface,
etc.


When we need an operator to quit Blender, it's available, grouped with other window management operators.

At first I, too, didn't bother with naming, putting everything under bpy.ops.object. But namespace distinction really helps to document, browse and search all the operators. Predictable identifier + Python console's Autocomplete feature made it easier to discover and build upon existing operators, including those from other addons.

I don't know if it has any other significance, but self-documentation alone made the naming rule worthwhile to enforce.