You may be overthinking this.
One simple option is to have a condition in your PageController's show method (or CmsController's frontPage method as you have it) to check the draft status and have different return statements depending
Firstly its worth noting you can use a url slug as a unique identifier in your page (or cmspage) model. You just need a unique slug field in your pages table and then add this to your model:
public function getRouteKeyName()
{
return 'slug';
}
at this point Laravel route model binding will get the model from the slug instead of id.
// you have this as frontPage($url) but it seems like a show method
public function show(Page $page)
{
if($page->status == 'draft'){
return redirect('somewhere');
}
return view('frontend.frontpage', compact('page'));
}