As far as I know, having multiple packages (or name-spaces as they can be called) allows you to group related objects together and segregate objects that are less related into other packages.
If your "Flag" package makes constant references to the objects in "Flag::Data", those references must always be qualified. So if you had a variable, $indicator_data, in your "Flag::Data" package, it would have to be referenced with a qualifier within the "Flag" package:
That can make your code look more cluttered than if the variable was in the "Flag" package where it would not have to be qualified. So you may be tempted to keep everything in the same package.
However, if you don't want users who are using objects in "Flag" to reference the $indicator_data variable, you would be inclined to hide it within the "Flag::Data" package.
In essence, you would be structuring your file to tell your users of your package that they are free to use everything in the "Flag" name-space, but not in the "Flag::Data" name-space where you might want to change the behavior or structure of the objects in future.
Of course, you can segregate even further and put each package in its own file. That might be particularly helpful when packages are hundreds/thousands of lines long. As a personal preference however, I prefer to have everything I need in one file rather than jumping around from file to file trying to find where referenced objects are declared in. I hope that answers your first question.
By the way, I have never seen a package declaration like "Flag::Data" (with "::"), but my test shows that it works no differently than if it was declared as "FlagData". Perhaps there is a difference but I did not encounter it.